﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;
using Model;
using System.Configuration;

namespace DAO
{
    public class CategoriaDAO
    {
        private SqlConnection connection = null;
        private static String sqlConn = ConfigurationManager.ConnectionStrings["ControlePedidoDB"].ToString();
        private static CategoriaDAO categoriaDAO = null;

        private CategoriaDAO()
        {
            connection = new SqlConnection(sqlConn);
        }

        public static CategoriaDAO getInstance()
        {
            if (categoriaDAO == null)
            {
                categoriaDAO = new CategoriaDAO();
            }

            return categoriaDAO;
        }

        public bool inserir(Categoria categoria)
        {

            bool validacao = false;
            String SQL_INSERT = "INSERT INTO Categoria " +
                                 "(nome, descricao) VALUES " +
                                 " ('" + categoria.Nome +
                                 "', '" + categoria.Descricao + "')";
            SqlCommand command = null;

            try
            {
                //Abre a conexao com o BD
                connection.Open();

                //Cria comando SQL
                command = new SqlCommand(SQL_INSERT, connection);

                //Executa a query SQL
                command.ExecuteNonQuery();

                validacao = true;

            }
            catch (SqlException exception)
            {
            }
            finally
            {
                connection.Close();
            }

            return validacao;
        }

        public bool alterar(Categoria categoria)
        {
            bool validacao = false;


            String SQL_UPDATE = "UPDATE categoria SET " +
                                 "nome = '" + categoria.Nome +
                                 "', descricao = '" + categoria.Descricao + "' " + 
                                 "WHERE id_categoria = " + categoria.Codigo;

            SqlCommand command = null;

            try
            {

                connection.Open();

                command = new SqlCommand(SQL_UPDATE, connection);

                command.ExecuteNonQuery();

                validacao = true;

            }
            catch (Exception ex)
            {
            }
            finally
            {
                connection.Close();
            }

            return validacao;
        }

        public bool cancelar(Categoria categoria)
        {
            bool validacao = false;
            String SQL_CANCEL = "DELETE FROM categoria WHERE id_categoria=" + categoria.Codigo;

            SqlCommand command = null;

            try
            {
                connection.Open();

                command = new SqlCommand(SQL_CANCEL, connection);

                command.ExecuteNonQuery();

                validacao = true;
            }
            catch (Exception ex)
            {
            }
            finally
            {
                connection.Close();
            }

            return validacao;

        }

        public Categoria consultar(Categoria categoriaEntrada)
        {
            Categoria categoria = null;
            String SQL_CONSULTA = "SELECT * FROM Categoria " +
                                  "WHERE id_categoria='" + categoriaEntrada.Codigo + "'";
            SqlCommand commandPopula = null;
            SqlDataReader Reader = null;

            try
            {
                connection.Open();

                commandPopula = connection.CreateCommand();

                commandPopula.CommandText = SQL_CONSULTA;

                Reader = commandPopula.ExecuteReader();

                StringBuilder consulta = new StringBuilder();
                String[] resultadoBusca = null;

                while (Reader.Read())
                {
                    for (int i = 0; i < Reader.FieldCount; i++)
                    {
                        consulta.Append(Reader.GetValue(i).ToString() + '/');
                    }

                }

                resultadoBusca = consulta.ToString().Split('/');

                categoria = new Categoria();


                categoria.Codigo = categoriaEntrada.Codigo;
                categoria.Nome = resultadoBusca[1];
                categoria.Descricao = resultadoBusca[2];



            }
            catch (Exception ex)
            {
            }
            finally
            {
                connection.Close();
                Reader.Close();
            }

            return categoria;
        }

        public List<Categoria> recuperarTodasCategorias()
        {
            List<Categoria> categorias = null;
            String SQL_TODAS_CATEGORIAS = "SELECT id_categoria, nome FROM Categoria";
            SqlCommand comandoExecutar = null;
            SqlDataReader resultadoBusca = null;
            Categoria auxiliar = null;

            try
            {
                connection.Open();

                comandoExecutar = new SqlCommand(SQL_TODAS_CATEGORIAS, connection);

                resultadoBusca = comandoExecutar.ExecuteReader();

                categorias = new List<Categoria>();

                while (resultadoBusca.Read())
                {
                    auxiliar = new Categoria();

                    auxiliar.Codigo = Int32.Parse(resultadoBusca["id_categoria"].ToString());
                    auxiliar.Nome = resultadoBusca["nome"].ToString();

                    categorias.Add(auxiliar);
                }

            }
            catch (Exception cause)
            {
            }
            finally
            {
                connection.Close();
            }

            return categorias;
        }

        public List<Categoria> recuperarCategorias(Categoria categoria)
        {
            List<SqlParameter> parametros = new List<SqlParameter>();
            List<Categoria> categoriasRecuperadas = new List<Categoria>();
            Categoria auxiliar = null;
            String SQL_BUSCA = "SELECT id_categoria, nome, descricao FROM categoria WHERE ";
            SqlCommand comandoExecutar = null;
            SqlDataReader resultadoBusca = null;

            if (categoria.Codigo > 0)
            {
                SQL_BUSCA += "id_categoria = @id";

                parametros.Add(new SqlParameter("@id", categoria.Codigo));
            }

            if (categoria.Nome != null && !categoria.Nome.Equals(""))
            {

                if (SQL_BUSCA.Contains('@'))
                {
                    SQL_BUSCA += " AND ";
                }
                else
                {

                }
                SQL_BUSCA += "nome LIKE @nome";
                parametros.Add(new SqlParameter("@nome", "%" + categoria.Nome + "%"));
            }

            try
            {
                connection.Open();

                comandoExecutar = new SqlCommand(SQL_BUSCA, connection);

                foreach (var parametro in parametros)
                {
                    comandoExecutar.Parameters.Add(parametro);
                }

                resultadoBusca = comandoExecutar.ExecuteReader();

                while (resultadoBusca.Read())
                {
                    auxiliar = new Categoria();

                    auxiliar.Codigo = Int32.Parse(resultadoBusca["id_categoria"].ToString());
                    auxiliar.Nome = resultadoBusca["nome"].ToString();
                    auxiliar.Descricao = resultadoBusca["descricao"].ToString();

                    categoriasRecuperadas.Add(auxiliar);
                }

            }
            catch (Exception cause)
            {
                throw new Exception("A busca não trouxe nenhum resultado - causa: " + cause.Message);
            }
            finally
            {
                connection.Close();
            }

            return categoriasRecuperadas;
        }
    }
}